import 'package:flutter/material.dart';
import '../../app/widgets/placeholder/empty_placeholder.dart';
import '../../app/widgets/placeholder/loading_placeholder.dart';
import 'network.dart';

/// 基于 [Result] 的页面状态管理：[loadingPlaceholder]、[emptyPlaceholder]、
/// [networkErrorPlaceholder]、[dataWidget]。
///
/// [T] 为 [StatefulWidget]；[D] 为 [Result] 的范型。
///
/// 请注意：需手动将 [resultStateWidget] 添加到 widget tree 中。
///
/// {@tool snippet}
///
/// 使用示例：
///
/// ```dart
/// class _AnyWidgetState extends State<AnyWidget>
///     with ResultStateMixin<AnyWidget, DataModel> {
///   @override
///   Widget build(BuildContext context) {
///     return Scaffold(
///       appBar: AppBar(...),
///       body: Container(
///         decoration: BoxDecoration(
///           image: DecorationImage(
///             image: MagicImage.assetImage('bg_img'),
///             fit: BoxFit.contain,
///             alignment: Alignment.topCenter,
///           ),
///         ),
///         child: resultStateWidget,
///       ),
///     );
///   }
/// }
/// ```
/// {@end-tool}
mixin ResultStateMixin<T extends StatefulWidget, D> on State<T> {
  /// 接口请求结果。
  Result<D>? result;

  bool get isLoading => result == null;
  bool get isSuccess => result?.isSuccess ?? false;
  bool get isNetworkError => result?.isFailed ?? false;
  bool get hasData => result?.data != null;

  /// 接口请求返回的数据。
  D? get data => result?.data;

  Widget get loadingPlaceholder => const LoadingPlaceholder();
  Widget get emptyPlaceholder => const EmptyPlaceholder();
  Widget get networkErrorPlaceholder => EmptyPlaceholder.networkError(onTapButton: onTapNetworkRetry);

  /// 页面状态 widget，请手动将 [resultStateWidget] 放置在 widget tree 中。
  Widget get resultStateWidget {
    if (isLoading) return loadingPlaceholder;
    if (isNetworkError) return networkErrorPlaceholder;
    if (isEmpty) return emptyPlaceholder;
    return dataWidget;
  }

  /// 根据 [data] 是否为 null 来判断是否显示 [EmptyPlaceholder]。
  /// 如果需要根据其他条件来判断，请重载提供自定义实现。
  bool get isEmpty => data == null;

  bool get isNotEmpty => !isEmpty;

  /// 基于 [data] 构造的 [Widget]。
  Widget get dataWidget;

  @override
  void initState() {
    super.initState();

    loadData();
  }

  /// 接口请求操作，请实现该方法。
  Future<void> loadData();

  /// 点击 [networkErrorPlaceholder] 重新加载按钮的操作。
  void onTapNetworkRetry() {
    setState(() {
      result = null;
    });

    loadData();
  }
}
